/*
 * EXP_REL.java
 *
 * Created on 28 de Fevereiro de 2009, 18:37
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package compilador.analisadorSintatico.operacoes;

import compilador.analisadorLexico.Token;
import compilador.analisadorLexico.TokenClass;
import compilador.analisadorSintatico.Producao;
import compilador.analisadorSintatico.TokenReader;
import compilador.analisadorSintatico.simboloGramatical.NaoTerminal;
import compilador.analisadorSintatico.simboloGramatical.SimboloGramatical;

/**
 *  <EXP_REL> ::= <exp_arit> <op_rel> <exp_arit>
 *
 * @author Joaquim Ranyere
 */
public class EXP_REL extends Producao  {
    
    /** Creates a new instance of EXP_REL */
    public EXP_REL() {
    }
    
    @Override
    public void setSimbolo() {
        this.simbolo = new NaoTerminal(this.getClass().getSimpleName());
    }
    
    public SimboloGramatical derivar() throws Exception {
        
        TokenReader tokenReader = TokenReader.getInstance();
        
        Token token = null;
        
        // primeiro lado da deriva��o
        ((NaoTerminal)  this.simbolo).add(new EXP_ARIT().derivar());
        
        if (isREL(tokenReader.seeCurrent())){
            // olha se � uma rela��o atra�s do operador relacional:
            ((NaoTerminal)  this.simbolo).add(new OP_REL().derivar());
            
            // segundo lado da deriva��o
            ((NaoTerminal)  this.simbolo).add(new EXP_ARIT().derivar());
        } 
        
        return ((NaoTerminal)  this.simbolo);
        
    }
    
    public boolean isREL(Token t){
        
        if (t.getTokenClass().equals(TokenClass.OPERADOR) && 
                (t.getAtributo().equals("==") || t.getAtributo().equals("!=") ||
                t.getAtributo().equals(">") || t.getAtributo().equals(">=") ||
                t.getAtributo().equals("<") || t.getAtributo().equals("<="))) 
        {
           return true;
        } else {
            return false;
        }
    }

}



